#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include <signal.h>

/*
^C^C^C^C^C^C^CCtrl + c
^CCtrl + c
^CCtrl + c
^\退出 (核心已转储)

在信号被阻塞的时候，信号处于未决状态，等到解除阻塞后，信号会被处理。这里若在阻塞时发了多次信号，也只会被当作一个信号处理。
 */

typedef void (*sighandler_t)(int);

sighandler_t oldact;

void handler(int sig){
	printf("Ctrl + c\n");
}

int main(){
	//初始化sigaction
	struct sigaction act;
	act.sa_handler = handler;
	act.sa_flags = 0;
	sigemptyset(&act.sa_mask);

	//信号捕捉：将CRTL + C信号的行为 由杀掉进程改成 打印
	sigaction(SIGINT, &act, NULL);

	//将SIGINT信号添加到sigset集合中，为后续实现信号阻塞作准备
	sigset_t set;
	sigemptyset(&set);
	sigaddset(&set, SIGINT);

	//实现对信号的阻塞
	sigprocmask(SIG_BLOCK, &set, NULL);

	sleep(5);

	//休息5秒后，解除对信号的阻塞
	sigprocmask(SIG_UNBLOCK, &set, NULL);

	while(1){
		sleep(1);
	}
}
